package tp.pr5.mv.instructions.stack;

import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.Opcode;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.inout.InMethod;
import tp.pr5.mv.inout.OutMethod;
import tp.pr5.mv.traps.MVTrap;
import tp.pr5.mv.traps.WithoutOperandsEx;

public class FLIP extends Instruction {

	
	public FLIP() { // Constructor por defecto
		
		op = Opcode.FLIP;
		
	}
	
	public void execute(OperandStack stack, Memory mem, ProgramCounter pc, InMethod inMethod, OutMethod outMethod) throws MVTrap {

		if (stack.getCounter() < 2)    // Necesitamos al menos dos operandos en la pila.
		    throw new WithoutOperandsEx( this, stack.getCounter() );    // Lanzamos la excepción pues no hay suf. operandos en la pila.
		
		
		int a = stack.top();   // Retiramos los valores de la cima y subcima y los depositamos en la pila en orden contrario	
		stack.pop();
		int b = stack.top();
		stack.pop();
		stack.push(a);
		stack.push(b);
		
		
	}

	
	
	
}
